package lanqiaobei2013;

import java.math.BigDecimal;
import java.math.BigInteger;

public class _08黄金连分数 {
    public static void main(String[] args) {
        /**
         * 黄金分割数0.61803... 是个无理数，这个常数十分重要，在许多工程问题中会出现。
         * 有时需要把这个数字求得很精确。我们如何求得黄金分割数的尽可能精确的值呢？有许多方法。
         *     比较简单的一种是用连分数：
         *                                1
         *     黄金数 = -------------------------------
         *                                  1
         *                     1 + --------------------
         *                                  1
         *                          1 + -------------
         *                                        1
         *                                1 + -------
         *                                        1 + ...
         *
         *    这个连分数计算的“层数”越多，它的值越接近黄金分割数。请你利用这一特性，求出黄金分割数的足够精确值，要求四舍五入到小数点后100位。
         *     小数点后3位的值为：0.618
         *     小数点后4位的值为：0.6180
         *     小数点后5位的值为：0.61803
         *     小数点后7位的值为：0.6180340 （注意尾部的0，不能忽略）
         */
        //化为求斐波那契相邻两项的比值
        /*
       第一项 1/1+1=1/2
       第二项 1/1+1/2=2/3
       第三项 1/1+2/3=3/5
       第四项 1/1+3/5=5/8
       第五项 1/1+5/8=8/13
       分子是前一项的分母，分母是前一项的分子分母相加
         */
        BigInteger a = BigInteger.ONE;
        BigInteger b = BigInteger.ONE;
        for (int i  = 3 ; i < 500 ; i ++){  //循环次数越大精度越高
            BigInteger temp = b;
            b = a.add(b);
            a = temp;
        }
        BigDecimal divide = new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
        System.out.println(divide.toPlainString().substring(0,103));
        //0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375
    }
}
